surface: Make only toplevels control events
authorMatthias Clasen <mclasen@redhat.com>
Wed, 22 May 2019 20:58:24 +0000 (20:58 +0000)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 28 May 2019 20:25:17 +0000 (20:25 +0000)
There is no need for popups to connect to the frame
clock to pause and unpause events on the display -
the toplevel already does it.

And don't connect to paint either - handle paint
on popups recursively.

gdk/gdksurface.c

index 7db9f2cc8dedc50a94e52c6a92b46b17941e3034..c48a3b09590c0a518fe13da64172016498b39c7a 100644 (file)
@@ -1371,9 +1371,8 @@ static void
 gdk_surface_paint_on_clock (GdkFrameClock *clock,
                             void          *data)
 {
-  GdkSurface *surface;
-
-  surface = GDK_SURFACE (data);
+  GdkSurface *surface = GDK_SURFACE (data);
+  GList *l;
 
   g_return_if_fail (GDK_IS_SURFACE (surface));
 
@@ -1394,6 +1393,9 @@ gdk_surface_paint_on_clock (GdkFrameClock *clock,
       gdk_surface_remove_update_surface (surface);
     }
 
+  for (l = surface->children; l; l = l->next)
+    gdk_surface_paint_on_clock (clock, l->data);
+
   g_object_unref (surface);
 }
 
@@ -3725,34 +3727,40 @@ gdk_surface_set_frame_clock (GdkSurface     *surface,
   if (clock)
     {
       g_object_ref (clock);
-      g_signal_connect (G_OBJECT (clock),
-                        "flush-events",
-                        G_CALLBACK (gdk_surface_flush_events),
-                        surface);
-      g_signal_connect (G_OBJECT (clock),
-                        "paint",
-                        G_CALLBACK (gdk_surface_paint_on_clock),
-                        surface);
-      g_signal_connect (G_OBJECT (clock),
-                        "resume-events",
-                        G_CALLBACK (gdk_surface_resume_events),
-                        surface);
+      if (surface->parent == NULL)
+        {
+          g_signal_connect (G_OBJECT (clock),
+                            "flush-events",
+                            G_CALLBACK (gdk_surface_flush_events),
+                            surface);
+          g_signal_connect (G_OBJECT (clock),
+                            "resume-events",
+                            G_CALLBACK (gdk_surface_resume_events),
+                            surface);
+          g_signal_connect (G_OBJECT (clock),
+                            "paint",
+                            G_CALLBACK (gdk_surface_paint_on_clock),
+                            surface);
+        }
     }
 
   if (surface->frame_clock)
     {
-      if (surface->frame_clock_events_paused)
-        gdk_surface_resume_events (surface->frame_clock, G_OBJECT (surface));
-
-      g_signal_handlers_disconnect_by_func (G_OBJECT (surface->frame_clock),
-                                            G_CALLBACK (gdk_surface_flush_events),
-                                            surface);
-      g_signal_handlers_disconnect_by_func (G_OBJECT (surface->frame_clock),
-                                            G_CALLBACK (gdk_surface_paint_on_clock),
-                                            surface);
-      g_signal_handlers_disconnect_by_func (G_OBJECT (surface->frame_clock),
-                                            G_CALLBACK (gdk_surface_resume_events),
-                                            surface);
+      if (surface->parent == NULL)
+        {
+          if (surface->frame_clock_events_paused)
+            gdk_surface_resume_events (surface->frame_clock, G_OBJECT (surface));
+
+          g_signal_handlers_disconnect_by_func (G_OBJECT (surface->frame_clock),
+                                                G_CALLBACK (gdk_surface_flush_events),
+                                                surface);
+          g_signal_handlers_disconnect_by_func (G_OBJECT (surface->frame_clock),
+                                                G_CALLBACK (gdk_surface_resume_events),
+                                                surface);
+          g_signal_handlers_disconnect_by_func (G_OBJECT (surface->frame_clock),
+                                                G_CALLBACK (gdk_surface_paint_on_clock),
+                                                surface);
+        }
       g_object_unref (surface->frame_clock);
     }